/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import clases.Usuario;
import java.sql.*;
import java.util.ArrayList;
import controlador.*;
import Util.*;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author JAVA
 */
public class PersistenciaUsuario extends PersistenciaConexion {

    /**
     * Carga un usuario
     * @param nickUsuario -> Identificador único del usuario
     * @return  -> devuelve un objeto de la clase usuario.
     */
    /*Modificado Rafa, funciona, no tocar!*/
    public static Usuario cargaUsuario(String nick) {
        Usuario usu = null;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            rs = st.executeQuery("SELECT * FROM usuario WHERE nickUsuario = '" + nick + "'");
            if (rs.first()) {

                /*Otra forma de sacar Usuario de la BBDD
                usu = new Usuario(
                rs.getString("nickUsuario"),                        
                rs.getInt("idUsuario"),
                rs.getString("nombre"),
                rs.getString("apellidos"),
                rs.getString("email"),
                rs.getString("poblacion"),
                rs.getString("provincia"),
                rs.getString("descripcionPersonal"),
                rs.getString("tipoPerfil"),
                rs.getString("contrasenya"),
                rs.getString("estado"),
                rs.getInt("invitaciones"),
                UtilFecha.obtenerFechaBD(rs.getString("fechaAlta")),
                UtilFecha.obtenerFechaBD(rs.getString("fechaBaja")),
                rs.getString("lema"), 
                rs.getString("sexo"),
                UtilFecha.obtenerFechaBD(rs.getString("fechaNacimiento")));
                 * 
                 */
                usu = new Usuario();
                usu.setIdUsuario(rs.getInt("idUsuario"));
                usu.setUsuario(rs.getString("nickUsuario"));
                usu.setNombre(rs.getString("nombre"));
                usu.setApellidos(rs.getString("apellidos"));
                usu.setEmail(rs.getString("email"));
                usu.setPoblacion(rs.getString("poblacion"));
                usu.setProvincia(rs.getString("provincia"));
                usu.setDescripcion(rs.getString("descripcionPersonal"));
                usu.setPerfil(rs.getString("tipoPerfil"));
                usu.setContrasenya(rs.getString("contrasenya"));
                usu.setTipo(rs.getString("estado"));
                usu.setFechaAlta(UtilFecha.obtenerFechaBD(rs.getString("fechaAlta")));
                usu.setFechaAlta(UtilFecha.obtenerFechaBD(rs.getString("fechaBaja")));
                usu.setLema(rs.getString("lema"));
                usu.setSexo(rs.getString("sexo"));
                usu.setFechaNacimiento(UtilFecha.obtenerFechaBD(rs.getString("fechaNacimiento")));
            }
            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
            return usu;
        }
    }

    /**
     * Comprueba si existe un Usuario
     * @param idUsuario
     * @return -> devuelve un entero, idUsuario, de la clase Usuario
     */
    //FUNCIONA, NO TOCARR, by Rafa
    public static boolean existeUsuario(String nick) {
        boolean existe = false;
        String sql = "select idUsuario from usuario where nickUsuario='" + nick + "'";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {
                existe = true;
            }
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si existe el usuario. " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);
        return existe;
    }

    //FUNCIONA, NO TOCARR, by Rafa
    public static boolean compruebaContrasenna(String nick, String auxClave) {
        boolean existe = false;
        String sql = "select idUsuario from usuario where nickUsuario='" + nick + "' and contrasenya='" + auxClave + "'";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {
                existe = true;
            }
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si existe el usuario. " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);
        return existe;
    }
    


    /**
     * Indica si un usuario esta dado de baja
     * @param indice
     * @return 
     */
    public static boolean esBajaUsuario(String nick) {
        boolean res = false;
        Connection con = null;
        Statement st = null;
        try {
            crearConexion();
            ResultSet rs = st.executeQuery("SELECT estado FROM " + usuario + " WHERE nickUsuario = " + nick);
            if (rs.first()) {
                if (rs.getInt("estado") == 0) {
                    res = true;
                }
            }
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return res;
    }

    /**
     * Da de alta a un nuevo Usuario que está de baja
     * @param nombreUsuario
     * @return -> devuelve un boolean, True o False
     */
    public static boolean darAltaUsuario(String nick) throws SQLException {
        boolean res = false;
        Connection con = null;
        Statement st = null;
        try {
            crearConexion();
            int rowcount = st.executeUpdate("UPDATE " + usuario + " SET "
                    + "estado = alta WHERE nickUsuario = " + nick);
            if (rowcount == 1) {
                res = true;
            }
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return res;

    }

    /**
     * Da de alta un nuevo usuario en la base de datos
     * @param sujeto   -> Objeto usuario
     */
    /*public static void registrarUsuario(Usuario usu) {
    String cadenaSql = "";
    Connection con = null;
    Statement st = null;
    String alta="alta";
    try {            
    // Registro un cliente                
    cadenaSql = "INSERT INTO   usuario "
    + " (nombre, apellidos, email, poblacion, provincia, descripcionPersonal,tipoPerfil,"
    + " estado, contrasenya, fechaAlta, fechaBaja, invitaciones, lema, sexo, fechaNacimiento,"
    + " nickUsuario)"
    + " VALUES ('" + usu.getUsuario() + "','"
    + usu.getNombre() + "','"
    + usu.getApellidos() + "','"
    + usu.getEmail() + "','"
    + usu.getPoblacion() + "','"
    + usu.getProvincia() + "','"
    + usu.getDescripcion() + "','"
    + usu.getPerfil() + "','"
    + alta + "','"
    + usu.getContrasenya() + "','"
    + UtilFecha.fechaMySQL(usu.getFechaAlta()) + "','"
    + UtilFecha.fechaMySQL(usu.getFechaBaja()) + "','"
    + usu.getInvitaciones() + "','"
    + usu.getLema() + "','"
    + usu.getSexo() +"','"
    + UtilFecha.fechaMySQL(usu.getFechaNacimiento()) + "','"
    + usu.getDescripcion()+ "','"
    + usu.getPerfil()+ "','"
    + alta+ "','"
    + usu.getContrasenya()+ "','"                   
    + UtilFecha.fechaMySQL(usu.getFechaAlta())+ "','"       
    + UtilFecha.fechaMySQL(usu.getFechaBaja()) + "','" 
    + usu.getInvitaciones()+ "','"
    + usu.getLema()+ "','"
    + usu.getSexo() + "','"
    + UtilFecha.fechaMySQL(usu.getFechaNacimiento())+ "','"
    + usu.getUsuario()+"');";
    
    crearConexion();
    st.executeUpdate(cadenaSql);
    } catch (Exception e) {
    System.out.println("ERROR");
    } finally {
    PersistenciaConexion.cerrarConexion(con);
    }
    }
     */
    /*hecho por rafa, FUNCIONAA, NO TOCAR!*/
    public static void registrarUsuario(Usuario usu) {
        int invitaciones = Usuario.MAX_INVITACIONES;
        Connection con = null;
        Statement st = null;
        String ds = UtilFecha.fechaMySQL(usu.getFechaAlta());
        String ss= UtilFecha.fechaMySQL(usu.getFechaBaja());
        String nsa = UtilFecha.fechaMySQL(usu.getFechaNacimiento());
        String alta="alta";
        String sql = "insert into usuario (nombre, apellidos, email, poblacion, provincia, descripcionPersonal,"
                + "tipoPerfil, estado, contrasenya, fechaAlta, fechaBaja, invitaciones, lema, sexo, fechaNacimiento, nickUsuario)"
                 +" values ('" + usu.getNombre() + "','"
                + usu.getApellidos() + "','"
                + usu.getEmail() + "','"
                + usu.getPoblacion() + "','"
                + usu.getProvincia() + "','"
                + usu.getDescripcion() + "','"
                + usu.getPerfil() + "','"
                + alta + "','"
                + usu.getContrasenya() + "','"
                + UtilFecha.fechaMySQL(usu.getFechaAlta()) + "','"
                + UtilFecha.fechaMySQL(usu.getFechaBaja()) + "',"
                + invitaciones + ",'"
                + usu.getLema() + "','"
                + usu.getSexo() + "','"
                + UtilFecha.fechaMySQL(usu.getFechaNacimiento()) + "','"
                + usu.getUsuario() + "')";


        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
        } catch (Exception e) {
            System.out.println("[!] Error al insertar un nuevo usuario. " + e.getMessage());
        }

        PersistenciaConexion.cerrarConexion(con);
    }
    /*hecho por rafa, FUNCIONAA, NO TOCAR!*/

    public static void actualizaUsuario(Usuario usu) {
        //he cambiado invitaciones, por si no funciona
        String sql = "update usuario set nombre ='" + usu.getNombre() + "',apellidos ='"
                + usu.getApellidos() + "', email = '" + usu.getEmail() + "', poblacion = '" + usu.getPoblacion() + "', "
                + "provincia ='" + usu.getProvincia() + "',descripcionPersonal ='" + usu.getDescripcion() + "',tipoPerfil ='"
                + usu.getPerfil() + "',estado ='" + usu.getTipo() + "',contrasenya ='" + usu.getContrasenya() + "',fechaAlta='" + UtilFecha.fechaMySQL(usu.getFechaAlta())
                + "',fechaBaja ='" + UtilFecha.fechaMySQL(usu.getFechaBaja()) + "',invitaciones=" + usu.getInvitaciones() + ",lema='" + usu.getLema() + "',"
                + "sexo= '" + usu.getSexo() + "', fechaNacimiento='" + UtilFecha.fechaMySQL(usu.getFechaNacimiento())
                + "' where nickUsuario ='" + usu.getUsuario() + "'";


        Connection con = null;
        Statement st = null;
        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();

        } catch (Exception e) {
            System.out.println("Error al actualizar el estado del usuario. " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);
    }

    public static Collection<Usuario> buscaUsuarioNombreApellido(String nombre, String apellidos) {
        Collection<Usuario> lstUsuarios = new ArrayList();
        String sql = "select nickUsuario from  usuario where estado = 'alta' and nombre like '%" + nombre + "%' and apellidos like '%" + apellidos + "%'";

        Connection con = null;

        try {
            con = PersistenciaConexion.crearConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Usuario usu = new Usuario();
                usu = PersistenciaUsuario.cargaUsuario(rs.getString("nickUsuario"));
                lstUsuarios.add(usu);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener mensaje " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);

        return lstUsuarios;
    }

    public static Collection<Usuario> buscaUsuarioEmail(String email) {
        Collection<Usuario> lstUsuarios = new ArrayList();
        String sql = "select nickUsuario from  usuario where estado = 'alta' and email like '%" + email + "%'";

        Connection con = null;

        try {
            con = PersistenciaConexion.crearConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Usuario usu = new Usuario();
                usu = PersistenciaUsuario.cargaUsuario(rs.getString("nickUsuario"));
                lstUsuarios.add(usu);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener mensaje " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);

        return lstUsuarios;
    }

    public static Collection<Usuario> buscaUsuarioNick(String nick) {
        Collection<Usuario> lstUsuarios = new ArrayList();
        String sql = "select nickUsuario from  usuario where estado = 'alta' and nickUsuario like '%" + nick + "%'";

        Connection con = null;

        try {
            con = PersistenciaConexion.crearConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Usuario usu = new Usuario();
                usu = PersistenciaUsuario.cargaUsuario(rs.getString("nickUsuario"));
                lstUsuarios.add(usu);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener mensaje " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);

        return lstUsuarios;
    }
    
}
/**
 * 
 * @param categoria
 */
/* public static void modificarUsuario(String nick) {
String cadenaSql = "";
try {
// Modificamos un usuario                                  
cadenaSql = "UPDATE usuario "                   
+ " SET nombre     = '" + usu.getNombre() 
+ ", apellidos        = " + usu.getApellidos()
+ ", email = " + usu.getEmail()
+ ", poblacion   = " + usu.getPoblacion()
+ ", provincia   = " + usu.getProvincia()
+ ", descripcionPersonal = " + usu.getDescripcion()
+ ", tipoPerfil = " + usu.getPerfil()
+ ", estado = " + usu
+ ", contrasenya = " + usu.getContrasenya()
+ ", fechaAlta = " + usu.getFechaAlta()
+ ", fechaBaja = " + usu.getFechaBaja()
+ ", invitaciones = " + usu.getInvitaciones()
+ ", lema = " + usu.getLema()
+ ", sexo = " + usu.getSexo()
+ ", fechaNacimiento = " + usu.getFechaNacimiento()
+ " WHERE nickUsuario       = " + nick + ";";

crearConexion();
st.executeUpdate(cadenaSql);
} catch (Exception e) {           
System.out.println("ERROR");
} finally {
cerrarConexion();
}    
}
 */
